#include "EventLoopThreadPool.h"

// #include "EventLoopThreadPool.h"
// #include "EventLoopThread.h"

// #include <memory>
EventLoopThreadPool::EventLoopThreadPool(EventLoop *baseLoop, const std::string &nameArg)
    : baseLoop_(baseLoop), name_(nameArg), started_(false), numThreads_(0), next_(0) {};
EventLoopThreadPool::~EventLoopThreadPool() {

};
void EventLoopThreadPool::start(const ThreadInitCallback &cb)
{
    started_ = true;
    for (int i = 0; i < numThreads_; ++i)
    {
        char buf[name_.size() + 32];
        snprintf(buf, sizeof buf, "%s%d", name_.c_str(), i);
        EventLoopThread *thread = new EventLoopThread(cb, buf);
        threads_.push_back(std::unique_ptr<EventLoopThread>(thread));
        loops_.push_back(thread->startLoop()); // 这里底层创建新线程,绑定一个新的EventLoop, 返回loop地址
    }
    if (numThreads_ == 0 && baseLoop_)
    {
        cb(baseLoop_);
    }
};
//baseloop默认以轮询的方式将channel分配给每一个subloop
EventLoop *EventLoopThreadPool::getNextloop()
{
    EventLoop *loop = baseLoop_;
    if (!loops_.empty())//轮询获取线程池中的每一个loop
    {
        loop = loops_[next_];
        ++next_;
        if (next_ >= loops_.size())
        {
            next_ = 0;
        }
    }
    return loop;
};
std::vector<EventLoop *> EventLoopThreadPool::getAllLoops()
{
    if (loops_.empty())
    {
        return std::vector<EventLoop *>(1, baseLoop_);
    }
    else
    {
        return loops_;
    }
};